🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / connections / src / commonMain / kotlin / org / meshtastic / feature / connections / ui / ConnectionsScreen.kt
Displaying Raw • Download
feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ui/ConnectionsScreen.kt e85300531e124df08788c1b765d50af1bf6d516d (e8530053) Text, 17.30 KB
T8b949e/*
* Copyright (c) 2025-2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.connections.ui
Tff7b72import T7ee787androidx.compose.animation.Crossfade
Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Box
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.Spacer
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.height
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.rememberScrollState
Tff7b72import T7ee787androidx.compose.foundation.verticalScroll
Tff7b72import T7ee787androidx.compose.material3.Card
Tff7b72import T7ee787androidx.compose.material3.CardDefaults
Tff7b72import T7ee787androidx.compose.material3.ExperimentalMaterial3Api
Tff7b72import T7ee787androidx.compose.material3.Scaffold
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.text.font.FontFamily
Tff7b72import T7ee787androidx.compose.ui.text.style.TextAlign
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.compose.ui.unit.sp
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787org.jetbrains.compose.resources.getString
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.koin.compose.viewmodel.koinViewModel
Tff7b72import T7ee787org.meshtastic.core.model.ConnectionState
Tff7b72import T7ee787org.meshtastic.core.model.DeviceType
Tff7b72import T7ee787org.meshtastic.core.navigation.Route
Tff7b72import T7ee787org.meshtastic.core.navigation.SettingsRoute
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.connected
Tff7b72import T7ee787org.meshtastic.core.resources.connected_device
Tff7b72import T7ee787org.meshtastic.core.resources.connected_sleeping
Tff7b72import T7ee787org.meshtastic.core.resources.connecting
Tff7b72import T7ee787org.meshtastic.core.resources.connections
Tff7b72import T7ee787org.meshtastic.core.resources.must_set_region
Tff7b72import T7ee787org.meshtastic.core.resources.no_device_selected
Tff7b72import T7ee787org.meshtastic.core.resources.not_connected
Tff7b72import T7ee787org.meshtastic.core.resources.set_your_region
Tff7b72import T7ee787org.meshtastic.core.resources.unknown_device
Tff7b72import T7ee787org.meshtastic.core.ui.component.ListItem
Tff7b72import T7ee787org.meshtastic.core.ui.component.MainAppBar
Tff7b72import T7ee787org.meshtastic.core.ui.component.TitledCard
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Language
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MeshtasticIcons
Tff7b72import T7ee787org.meshtastic.core.ui.icon.NoDevice
Tff7b72import T7ee787org.meshtastic.core.ui.viewmodel.ConnectionsViewModel
Tff7b72import T7ee787org.meshtastic.feature.connections.NO_DEVICE_SELECTED
Tff7b72import T7ee787org.meshtastic.feature.connections.ScannerViewModel
Tff7b72import T7ee787org.meshtastic.feature.connections.model.DeviceListEntry
Tff7b72import T7ee787org.meshtastic.feature.connections.ui.components.BLEDevices
Tff7b72import T7ee787org.meshtastic.feature.connections.ui.components.ConnectingDeviceInfo
Tff7b72import T7ee787org.meshtastic.feature.connections.ui.components.ConnectionsSegmentedBar
Tff7b72import T7ee787org.meshtastic.feature.connections.ui.components.CurrentlyConnectedInfo
Tff7b72import T7ee787org.meshtastic.feature.connections.ui.components.EmptyStateContent
Tff7b72import T7ee787org.meshtastic.feature.connections.ui.components.NetworkDevices
Tff7b72import T7ee787org.meshtastic.feature.connections.ui.components.UsbDevices
Tff7b72import T7ee787org.meshtastic.feature.settings.navigation.ConfigRoute
Tff7b72import T7ee787org.meshtastic.feature.settings.navigation.getNavRouteFrom
Tff7b72import T7ee787org.meshtastic.feature.settings.radio.RadioConfigViewModel
Tff7b72import T7ee787org.meshtastic.feature.settings.radio.component.PacketResponseStateDialog
Tff7b72import T7ee787kotlin.uuid.ExperimentalUuidApi
T8b949e/** Composable screen for managing device connections (BLE, TCP, USB). It displays connection status. */
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ApiTff7b72::Te6edf3classTb4b4b4, Te6edf3ExperimentalUuidApiTff7b72::Te6edf3classTb4b4b4)
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffModifierMissingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffComposableParamOrderTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72fun Td2a8ffConnectionsScreenTb4b4b4(
Te6edf3connectionsViewModelTb4b4b4: Te6edf3ConnectionsViewModel Tff7b72= Te6edf3koinViewModelTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3scanModelTb4b4b4: Te6edf3ScannerViewModel Tff7b72= Te6edf3koinViewModelTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3radioConfigViewModelTb4b4b4: Te6edf3RadioConfigViewModel Tff7b72= Te6edf3koinViewModelTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3onClickNodeChipTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onNavigateToNodeDetailsTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onConfigNavigateTb4b4b4: Tb4b4b4(Te6edf3RouteTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3radioConfigState Tff7b72by Te6edf3radioConfigViewModelTb4b4b4.Te6edf3radioConfigStateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3scanStatusText Tff7b72by Te6edf3scanModelTb4b4b4.Te6edf3errorTextTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3connectionState Tff7b72by Te6edf3connectionsViewModelTb4b4b4.Te6edf3connectionStateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3ourNode Tff7b72by Te6edf3connectionsViewModelTb4b4b4.Te6edf3ourNodeForDisplayTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3regionUnset Tff7b72by Te6edf3connectionsViewModelTb4b4b4.Te6edf3regionUnsetTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3selectedDevice Tff7b72by Te6edf3scanModelTb4b4b4.Te6edf3selectedNotNullFlowTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3persistedDeviceName Tff7b72by Te6edf3scanModelTb4b4b4.Te6edf3persistedDeviceNameTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3bleDevices Tff7b72by Te6edf3scanModelTb4b4b4.Te6edf3bleDevicesForUiTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3discoveredTcpDevices Tff7b72by Te6edf3scanModelTb4b4b4.Te6edf3discoveredTcpDevicesForUiTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3recentTcpDevices Tff7b72by Te6edf3scanModelTb4b4b4.Te6edf3recentTcpDevicesForUiTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3usbDevices Tff7b72by Te6edf3scanModelTb4b4b4.Te6edf3usbDevicesForUiTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
T8b949e/* Animate waiting for the configurations */
Tff7b72var Te6edf3isWaiting Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3isWaitingTb4b4b4) Tb4b4b4{
Te6edf3PacketResponseStateDialogTb4b4b4(
Te6edf3state Tff7b72= Te6edf3radioConfigStateTb4b4b4.Te6edf3responseStateTb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{
Te6edf3isWaiting Tff7b72= Tff7b72false
Te6edf3radioConfigViewModelTb4b4b4.Te6edf3clearPacketResponseTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3onComplete Tff7b72= Tb4b4b4{
Te6edf3getNavRouteFromTb4b4b4(Te6edf3radioConfigStateTb4b4b4.Te6edf3routeTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3route Tff7b72-Tff7b72>
Te6edf3isWaiting Tff7b72= Tff7b72false
Te6edf3radioConfigViewModelTb4b4b4.Te6edf3clearPacketResponseTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3route Tff7b72=Tff7b72= Te6edf3SettingsRouteTb4b4b4.Te6edf3LoRaTb4b4b4) Tb4b4b4{
Te6edf3onConfigNavigateTb4b4b4(Te6edf3SettingsRouteTb4b4b4.Te6edf3LoRaTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3LaunchedEffectTb4b4b4(Te6edf3connectionStateTb4b4b4, Te6edf3regionUnsetTb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3connectionStateTb4b4b4) Tb4b4b4{
Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3regionUnsetTb4b4b4) Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3must_set_region Tff7b72else Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3connected
Tb4b4b4}
Te6edf3ConnectionStateTb4b4b4.Te6edf3Connecting Tff7b72-Tff7b72> Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3connecting
Te6edf3ConnectionStateTb4b4b4.Te6edf3Disconnected Tff7b72-Tff7b72> Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3not_connected
Te6edf3ConnectionStateTb4b4b4.Te6edf3DeviceSleep Tff7b72-Tff7b72> Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3connected_sleeping
Tb4b4b4}Tb4b4b4.Te6edf3let Tb4b4b4{ Te6edf3scanModelTb4b4b4.Te6edf3setErrorTextTb4b4b4(Te6edf3getStringTb4b4b4(Tffa657itTb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Te6edf3ScaffoldTb4b4b4(
Te6edf3topBar Tff7b72= Tb4b4b4{
Te6edf3MainAppBarTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3connectionsTb4b4b4)Tb4b4b4,
Te6edf3ourNode Tff7b72= Te6edf3ourNodeTb4b4b4,
Te6edf3showNodeChip Tff7b72= Te6edf3ourNode Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3connectionState Tff7b72is Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4,
Te6edf3canNavigateUp Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3onNavigateUp Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3actions Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3onClickChip Tff7b72= Tb4b4b4{ Te6edf3onClickNodeChipTb4b4b4(Tffa657itTb4b4b4.Te6edf3numTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3paddingValues Tff7b72-Tff7b72>
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3paddingValuesTb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3uiState Tff7b72=
Tff7b72when Tb4b4b4{
Te6edf3connectionState Tff7b72is Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected Tff7b72&Tff7b72& Te6edf3ourNode Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72>
Te6edf3ConnectionUiStateTb4b4b4.Te6edf3CONNECTED_WITH_NODE
Te6edf3connectionState Tff7b72is Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected Tff7b72|Tff7b72|
Te6edf3connectionState Tff7b72=Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connecting Tff7b72|Tff7b72|
Te6edf3selectedDevice Tff7b72!Tff7b72= Te6edf3NO_DEVICE_SELECTED Tff7b72-Tff7b72> Te6edf3ConnectionUiStateTb4b4b4.Te6edf3CONNECTING
Tff7b72else Tff7b72-Tff7b72> Te6edf3ConnectionUiStateTb4b4b4.Te6edf3NO_DEVICE
Tb4b4b4}
Te6edf3CrossfadeTb4b4b4(Te6edf3targetState Tff7b72= Te6edf3uiStateTb4b4b4, Te6edf3label Tff7b72= Ta5d6ff"Ta5d6ffconnection_stateTa5d6ff"Tb4b4b4) Tb4b4b4{ Te6edf3state Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3stateTb4b4b4) Tb4b4b4{
Te6edf3ConnectionUiStateTb4b4b4.Te6edf3CONNECTED_WITH_NODE Tff7b72-Tff7b72>
Te6edf3ConnectedDeviceContentTb4b4b4(
Te6edf3ourNode Tff7b72= Te6edf3ourNodeTb4b4b4,
Te6edf3regionUnset Tff7b72= Te6edf3regionUnsetTb4b4b4,
Te6edf3selectedDevice Tff7b72= Te6edf3selectedDeviceTb4b4b4,
Te6edf3bleDevices Tff7b72= Te6edf3bleDevicesTb4b4b4,
Te6edf3onNavigateToNodeDetails Tff7b72= Te6edf3onNavigateToNodeDetailsTb4b4b4,
Te6edf3onClickDisconnect Tff7b72= Tb4b4b4{ Te6edf3scanModelTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onSetRegion Tff7b72= Tb4b4b4{
Te6edf3isWaiting Tff7b72= Tff7b72true
Te6edf3radioConfigViewModelTb4b4b4.Te6edf3setResponseStateLoadingTb4b4b4(Te6edf3ConfigRouteTb4b4b4.Te6edf3LORATb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3ConnectionUiStateTb4b4b4.Te6edf3CONNECTING Tff7b72-Tff7b72>
Te6edf3ConnectingDeviceContentTb4b4b4(
Te6edf3connectionState Tff7b72= Te6edf3connectionStateTb4b4b4,
Te6edf3selectedDevice Tff7b72= Te6edf3selectedDeviceTb4b4b4,
Te6edf3persistedDeviceName Tff7b72= Te6edf3persistedDeviceNameTb4b4b4,
Te6edf3bleDevices Tff7b72= Te6edf3bleDevicesTb4b4b4,
Te6edf3discoveredTcpDevices Tff7b72= Te6edf3discoveredTcpDevicesTb4b4b4,
Te6edf3recentTcpDevices Tff7b72= Te6edf3recentTcpDevicesTb4b4b4,
Te6edf3usbDevices Tff7b72= Te6edf3usbDevicesTb4b4b4,
Te6edf3onClickDisconnect Tff7b72= Tb4b4b4{ Te6edf3scanModelTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Te6edf3NoDeviceContentTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72var Te6edf3selectedDeviceType Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Te6edf3DeviceTypeTb4b4b4.Te6edf3BLETb4b4b4) Tb4b4b4}
Te6edf3LaunchedEffectTb4b4b4(Te6edf3selectedDeviceTb4b4b4) Tb4b4b4{
Te6edf3DeviceTypeTb4b4b4.Te6edf3fromAddressTb4b4b4(Te6edf3selectedDeviceTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3selectedDeviceType Tff7b72= Tffa657it Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3supportedDeviceTypes Tff7b72= Te6edf3scanModelTb4b4b4.Te6edf3supportedDeviceTypes
T8b949e// Fallback to a supported type if the current one isn't
Te6edf3LaunchedEffectTb4b4b4(Te6edf3supportedDeviceTypesTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3selectedDeviceType Tff7b72!in Te6edf3supportedDeviceTypes Tff7b72&Tff7b72& Te6edf3supportedDeviceTypesTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3selectedDeviceType Tff7b72= Te6edf3supportedDeviceTypesTb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3ConnectionsSegmentedBarTb4b4b4(
Te6edf3selectedDeviceType Tff7b72= Te6edf3selectedDeviceTypeTb4b4b4,
Te6edf3supportedDeviceTypes Tff7b72= Te6edf3supportedDeviceTypesTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3selectedDeviceType Tff7b72= Tffa657it
Tb4b4b4}
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3selectedDeviceTypeTb4b4b4) Tb4b4b4{
Te6edf3DeviceTypeTb4b4b4.Te6edf3BLE Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3BLEDevicesTb4b4b4(
Te6edf3connectionState Tff7b72= Te6edf3connectionStateTb4b4b4,
Te6edf3selectedDevice Tff7b72= Te6edf3selectedDeviceTb4b4b4,
Te6edf3scanModel Tff7b72= Te6edf3scanModelTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3DeviceTypeTb4b4b4.Te6edf3TCP Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3ColumnTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3verticalScrollTb4b4b4(Te6edf3rememberScrollStateTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3NetworkDevicesTb4b4b4(
Te6edf3connectionState Tff7b72= Te6edf3connectionStateTb4b4b4,
Te6edf3discoveredNetworkDevices Tff7b72= Te6edf3discoveredTcpDevicesTb4b4b4,
Te6edf3recentNetworkDevices Tff7b72= Te6edf3recentTcpDevicesTb4b4b4,
Te6edf3selectedDevice Tff7b72= Te6edf3selectedDeviceTb4b4b4,
Te6edf3scanModel Tff7b72= Te6edf3scanModelTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3DeviceTypeTb4b4b4.Te6edf3USB Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3ColumnTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3verticalScrollTb4b4b4(Te6edf3rememberScrollStateTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3UsbDevicesTb4b4b4(
Te6edf3connectionState Tff7b72= Te6edf3connectionStateTb4b4b4,
Te6edf3usbDevices Tff7b72= Te6edf3usbDevicesTb4b4b4,
Te6edf3selectedDevice Tff7b72= Te6edf3selectedDeviceTb4b4b4,
Te6edf3scanModel Tff7b72= Te6edf3scanModelTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3scanStatusTextTff7b72?.Te6edf3let Tb4b4b4{
Te6edf3CardTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4.Te6edf3alignTb4b4b4(Te6edf3AlignmentTb4b4b4.Te6edf3BottomStartTb4b4b4)Tb4b4b4,
Te6edf3colors Tff7b72=
Te6edf3CardDefaultsTb4b4b4.Te6edf3cardColorsTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3copyTb4b4b4(Te6edf3containerColor Tff7b72= Te6edf3CardDefaultsTb4b4b4.Te6edf3cardColorsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3containerColorTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3alpha Tff7b72= T79c0ff0.5fTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Tffa657itTb4b4b4,
Te6edf3fontSize Tff7b72= T79c0ff1T79c0ff0.Te6edf3spTb4b4b4,
Te6edf3fontFamily Tff7b72= Te6edf3FontFamilyTb4b4b4.Te6edf3MonospaceTb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3EndTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e/** Content shown when connected to a device with node info available. */
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffConnectedDeviceContentTb4b4b4(
Te6edf3ourNodeTb4b4b4: Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3NodeTff7b72?Tb4b4b4,
Te6edf3regionUnsetTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3selectedDeviceTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3bleDevicesTb4b4b4: Te6edf3ListTff7b72<Te6edf3DeviceListEntryTff7b72>Tb4b4b4,
Te6edf3onNavigateToNodeDetailsTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onClickDisconnectTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onSetRegionTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ourNodeTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3node Tff7b72-Tff7b72>
Te6edf3TitledCardTb4b4b4(Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3connected_deviceTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3CurrentlyConnectedInfoTb4b4b4(
Te6edf3node Tff7b72= Te6edf3nodeTb4b4b4,
Te6edf3bleDevice Tff7b72= Te6edf3bleDevicesTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3fullAddress Tff7b72=Tff7b72= Te6edf3selectedDevice Tb4b4b4} Tff7b72as Te6edf3DeviceListEntryTb4b4b4.Te6edf3BleTff7b72?Tb4b4b4,
Te6edf3onNavigateToNodeDetails Tff7b72= Te6edf3onNavigateToNodeDetailsTb4b4b4,
Te6edf3onClickDisconnect Tff7b72= Te6edf3onClickDisconnectTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3regionUnset Tff7b72&Tff7b72& Te6edf3selectedDevice Tff7b72!Tff7b72= Ta5d6ff"Ta5d6ffmTa5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3TitledCardTb4b4b4(Te6edf3title Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3ListItemTb4b4b4(
Te6edf3leadingIcon Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3LanguageTb4b4b4,
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3set_your_regionTb4b4b4)Tb4b4b4,
Te6edf3onClick Tff7b72= Te6edf3onSetRegionTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e/** Content shown when connecting or a device is selected but node info is not yet available. */
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffConnectingDeviceContentTb4b4b4(
Te6edf3connectionStateTb4b4b4: Te6edf3ConnectionStateTb4b4b4,
Te6edf3selectedDeviceTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3persistedDeviceNameTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3bleDevicesTb4b4b4: Te6edf3ListTff7b72<Te6edf3DeviceListEntryTff7b72>Tb4b4b4,
Te6edf3discoveredTcpDevicesTb4b4b4: Te6edf3ListTff7b72<Te6edf3DeviceListEntryTff7b72>Tb4b4b4,
Te6edf3recentTcpDevicesTb4b4b4: Te6edf3ListTff7b72<Te6edf3DeviceListEntryTff7b72>Tb4b4b4,
Te6edf3usbDevicesTb4b4b4: Te6edf3ListTff7b72<Te6edf3DeviceListEntryTff7b72>Tb4b4b4,
Te6edf3onClickDisconnectTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3selectedEntry Tff7b72=
Te6edf3bleDevicesTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3fullAddress Tff7b72=Tff7b72= Te6edf3selectedDevice Tb4b4b4}
Tff7b72?: Te6edf3discoveredTcpDevicesTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3fullAddress Tff7b72=Tff7b72= Te6edf3selectedDevice Tb4b4b4}
Tff7b72?: Te6edf3recentTcpDevicesTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3fullAddress Tff7b72=Tff7b72= Te6edf3selectedDevice Tb4b4b4}
Tff7b72?: Te6edf3usbDevicesTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3fullAddress Tff7b72=Tff7b72= Te6edf3selectedDevice Tb4b4b4}
T8b949e// Use the entry name if found in scan lists, otherwise fall back to the persisted name
T8b949e// from the last successful selection, and only show "Unknown Device" as a last resort.
Tff7b72val Te6edf3name Tff7b72= Te6edf3selectedEntryTff7b72?.Te6edf3name Tff7b72?: Te6edf3persistedDeviceName Tff7b72?: Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3unknown_deviceTb4b4b4)
Tff7b72val Te6edf3address Tff7b72= Te6edf3selectedEntryTff7b72?.Te6edf3address Tff7b72?: Te6edf3selectedDevice
Te6edf3TitledCardTb4b4b4(Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3connected_deviceTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ConnectingDeviceInfoTb4b4b4(
Te6edf3connectionState Tff7b72= Te6edf3connectionStateTb4b4b4,
Te6edf3deviceName Tff7b72= Te6edf3nameTb4b4b4,
Te6edf3deviceAddress Tff7b72= Te6edf3addressTb4b4b4,
Te6edf3onClickDisconnect Tff7b72= Te6edf3onClickDisconnectTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e/** Content shown when no device is selected. */
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffNoDeviceContentTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3CardTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3EmptyStateContentTb4b4b4(
Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3NoDeviceTb4b4b4,
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3no_device_selectedTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e/** Visual state for the connection screen's [Crossfade] animation. */
Tff7b72private Tff7b72enum Tff7b72class T56d364ConnectionUiState Tb4b4b4{
T8b949e/** No device is selected. */
Te6edf3NO_DEVICETb4b4b4,
T8b949e/** A device is selected or we are actively connecting. */
Te6edf3CONNECTINGTb4b4b4,
T8b949e/** Connected with node info available. */
Te6edf3CONNECTED_WITH_NODETb4b4b4,
Tb4b4b4}
Served by rngit 1.5.4 - Generated in 0.06s